#pragma once

#include <typedef.h>
//
#include <semaphore.hpp>
#include <task_run.hpp>

// 文字类日志每行最大长度
#define LOG_TEMP_SIZE	(1000)
#define LOG_LINE_SIZE	(2000)
// 文字类日志buff大小为200行
#define LOG_LINE_CNT	(200)
// 结构类日志buff大小为1000个（即1000个结构体大小）
#define LOG_SIZE_STRUCT (1000)

#define NAME_LOG_FOLDER "logs"
#define NAME_LOG		"qs"

// 文字类日志
typedef struct log_text_s
{
	char* line[LOG_LINE_CNT];
	int head;
	int tail;
} log_text_s;

class LoggerAutoSave : public TaskRun
{
public:
	LoggerAutoSave();
	virtual ~LoggerAutoSave();

protected:
	virtual void Run(void* arg);
};

class Logger : public TaskRun
{
public:
	Logger();
	virtual ~Logger();
	static Logger* Instance();
	friend class LoggerAutoSave;

	// 启动日志服务
	void Start(void* arg = nullptr);
	// 保存日志到文件
	void Save(void);
	// 记录文字类日志
	void Text(int log_level, const char* line);

protected:
	virtual void Run(void* arg);

private:
	// 取得日志名
	void GetLogName(char* out_name, int size);
	// 加入新log
	void TextPush(const char* buff);
	// 取出全部log
	int TextPopAll(char* buff, int maxsize);
	// 当前log数量
	int TextCnt(void);

private:
	// 强制保存
	LoggerAutoSave m_AutoSave;
	// 运行标记
	bool m_Running;
	// 强制保存标记
	bool m_ForceSave;
	// 日志
	log_text_s* m_LogText;
	// 文件写入buff
	char* m_LogBuffText;
	// 线程信号量锁
	Semaphore m_SemRw;
	// 线程保存信号量信号
	Semaphore m_SemSig;
};

// 记录系统异常日志
void logger_dump_errors(int signo);
